MSE Go 探针通过在编译时进行代码增强,实现流量防护、全链路灰度等服务治理能力,不可避免地带来了一定的应用性能开销。MSE团队采用多项技术对探针进行优化,将探针的性能开销降低,以确保应用的稳定运行。本文中我们模拟真实微服务场景测试了Go 探针在不同流量下的性能影响,您可以参考本文分析报告,在接入MSE Go微服务治理之前,基于性能影响进行充分的评估。
Go 探针的实际性能影响依不同的应用实现而异,在接入完成之后,建议您在上线前对您的应用进行必要的性能测试,从而更准确的评估给您的应用带来的性能影响。
测试场景
整体服务架构如下图所示:
其中,Go应用A、B、C的Server侧使用Gin框架接收Web请求,Go应用A、B的Client侧采用HTTP协议发起对下游的调用,具体实现代码可参见mse-go-quickstart-demo。
测试环境
压测源由阿里云性能测试服务PTS提供,网络模式为公网。
Go应用A、B、C都部署在同一个阿里云容器服务ACK集群中,节点实例类型为ecs.c6.2xlarge,节点的操作系统版本为Alibaba Cloud Linux 3.2104 LTS 64位。
Go应用的Pod规格为1核2G,副本数量为2。
Go探针采用Aliyun GoAgent 1.1.0版本。
测试流程
在不接入微服务治理的情况下,分别使用最大QPS为100/300/500/700的请求执行压测,每次测试持续时长为1小时,压测结果将作为基线性能指标。压测过程中,初始QPS为100,每30s左右递增100,直到达到最大QPS。
为Go应用A、B、C接入微服务治理,重复第1步的压测,对比Go应用在CPU使用率、内存使用率、RT上的差异。
测试结果
基线性能指标
QPS | 应用A | 应用B | 应用C | ||||
CPU(%) | 内存(%) | RT(ms) | CPU(%) | 内存(%) | CPU(%) | 内存(%) | |
100 | 1.8 | 0.6 | 32 | 1.4 | 0.6 | 0.6 | 0.5 |
300 | 4.9 | 0.7 | 33 | 4.8 | 0.7 | 1.9 | 0.7 |
500 | 10.0 | 0.9 | 33 | 9.3 | 0.8 | 3.5 | 0.7 |
600 | 18.0 | 1.0 | 34 | 11.0 | 0.8 | 4.0 | 0.7 |
700 | 29.3 | 0.9 | 35 | 12.6 | 0.9 | 4.3 | 0.7 |
CPU指标代表Pod使用的CPU占总CPU的百分比。
内存指标代表Pod使用的内存占总内存的百分比。
RT指标代表请求的平均响应时间,单位:毫秒。
安装Go 探针之后的性能指标
QPS | 应用A | 应用B | 应用C | ||||
CPU(%) | 内存(%) | RT(ms) | CPU(%) | 内存(%) | CPU(%) | 内存(%) | |
100 | 2.6 | 1.3 | 32 | 2.6 | 1.3 | 0.8 | 1.1 |
300 | 7.9 | 1.4 | 34 | 8.0 | 1.3 | 2.5 | 1.1 |
500 | 13.9 | 1.5 | 36 | 15.2 | 1.5 | 3.9 | 1.2 |
600 | 24.6 | 1.6 | 37 | 18.8 | 1.6 | 4.8 | 1.3 |
700 | 36.5 | 1.7 | 37 | 21.5 | 1.6 | 5.9 | 1.3 |
性能开销
将安装Go 探针之后的性能指标结果,减去基线性能指标,能够更加直观地看到安装Go 探针之后给应用带来的额外开销。汇总结果如下所示。
QPS | 应用A | 应用B | 应用C | ||||
CPU(%) | 内存(%) | RT(ms) | CPU(%) | 内存(%) | CPU(%) | 内存(%) | |
100 | +0.8 | +0.7 | +0 | +1.2 | +0.7 | +0.2 | +0.6 |
300 | +3.0 | +0.7 | +1 | +3.2 | +0.6 | +0.6 | +0.4 |
500 | +3.9 | +0.6 | +3 | +5.9 | +0.7 | +0.4 | +0.5 |
600 | +6.6 | +0.6 | +3 | +7.8 | +0.8 | +0.8 | +0.6 |
700 | +7.2 | +0.8 | +2 | +8.9 | +0.7 | +1.6 | +0.6 |
上述结果的计算方式是通过将使用Go Agent后的CPU使用率、内存占用率和RT与未使用Go Agent时的CPU使用率、内存占用率和RT进行相减得到的结果。
不使用CPU使用率和内存占用率增长率的原因是,如果原本CPU使用率为25%,使用Go Agent后增加为30%,则CPU使用率增长率为20%;如果原本CPU使用率为50%,使用Go Agent增加为55%,则CPU使用率增长率为10%,该结果会跟随原本的CPU使用率而变化,不具有参考价值。
从变化趋势上看,Go Agent带来的CPU使用率和内存占用率变化,会随着QPS的提升而线性增加,该结果更具有参考意义。
测试结论
Go 探针额外造成的CPU开销均在10%以内,额外造成的内存占用均在1%以内,整体带来的资源开销较小。
Go 探针给请求的全链路RT增加了3ms以内的延迟,几乎可以忽略不计。